﻿#region Usings

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls;
using Telerik.Web.UI.Calendar;
using TimeTracker.Core.Domain.Entities;
using TimeTracker.Core.Domain.Enums;
using TimeTracker.Core.Utils;
using TimeTracker.Web.TimeTracker.Interface;
using TimeTracker.Web.TimeTracker.Presenter;
using DayRenderEventArgs = Telerik.Web.UI.Calendar.DayRenderEventArgs;

#endregion

namespace TimeTracker.Web.TimeTracker
{
    public partial class Sihterica : System.Web.UI.Page, ISihtericeView
    {
        private SihtericaPresenter _presenter;

        protected void Page_Load(object sender, EventArgs e)
        {
            _presenter = new SihtericaPresenter();

            if (!IsPostBack)
            {
                _presenter.Init(this);
                PodesiIspravneVrednosti();
                panelRadnikPodaci.Visible = false;
            }

        }

        #region implementacije view interfejsa

        public void PokaziInicijalneVrednosti(IList<OrganizacionaSema> organizacioneSeme)
        {
            ddlOrganizacioneJedinice.DataValueField = "OrganizacionaSemaId";
            ddlOrganizacioneJedinice.DataTextField = "ImeOrganizacioneSeme";
            ddlOrganizacioneJedinice.DataSource = organizacioneSeme;
            ddlOrganizacioneJedinice.DataBind();

            IList<string> tipoviDana = (from TipDana dan in Enum.GetValues(typeof (TipDana)) 
                                        select DataUtils.NapraviStringOdEnumZaDane(dan)).ToList();

            IList<string> tipoviSati = (from TipSata sat in Enum.GetValues(typeof (TipSata))
                                        select DataUtils.NapraviStringOdEnumZaSate(sat)).ToList();

            ddlTipDana.DataSource = tipoviDana;
            ddlTipSataDodajPosebneSate.DataSource = tipoviSati;
            ddlTipDana.DataBind();
            ddlTipSataDodajPosebneSate.DataBind();
        }

        public void PokaziRadnikeOrganizacioneSeme(IList<Radnik> radnici)
        {
            gvRadnici.DataSource = radnici;
            gvRadnici.DataBind();
        }

        public void PokaziUnoseVremenaZaRadnika(IList<UnosVremenaSati> unosiVremena, Radnik selektovniRadnik)
        {
            if (unosiVremena.Count != 0)
            {
                radKalendar.SelectedDate = unosiVremena[unosiVremena.Count - 1].UnosVremena.UnosVremenaDatum;
                radKalendar.FocusedDate = radKalendar.SelectedDate;
            }

            lblImeSleketovanogRadnika.Text = selektovniRadnik.Ime + " " + selektovniRadnik.Prezime;

            PodesiIspravneVrednosti();
        }

        public void InicijalizujKalendarZaRadnika(IList<UnosVremena> unosiVremena, Radnik selektovniRadnik)
        {
            if (unosiVremena.Count != 0)
            {
                radKalendar.SelectedDate = unosiVremena[unosiVremena.Count - 1].UnosVremenaDatum;
                radKalendar.FocusedDate = radKalendar.SelectedDate;
            }
                        
            lblImeSleketovanogRadnika.Text = selektovniRadnik.Ime + " " + selektovniRadnik.Prezime;

            radKalendar.SelectedDate = DateTime.Now;
            radKalendar.FocusedDate = DateTime.Now;

            PodesiIspravneVrednosti();
        }

        public void PokaziUnosVremenaZaRadnika(UnosVremenaSati unosVremenaSati, DateTime dan)
        {
            if(unosVremenaSati != null)
            {
                radKalendar.SelectedDate = unosVremenaSati.UnosVremena.UnosVremenaDatum;
                radKalendar.FocusedDate = unosVremenaSati.UnosVremena.UnosVremenaDatum;

                tbBrojSati.Text = unosVremenaSati.BrojSati.ToString();
                tbOpis.Text = unosVremenaSati.UnosVremena.UnosVremenaOpis;
                PodesiIspravneVrednosti();
            }
            else
            {
                radKalendar.SelectedDate = dan;
                radKalendar.FocusedDate = radKalendar.SelectedDate;
                tbBrojSati.Text = "";
                tbOpis.Text = "";
                PodesiIspravneVrednosti();
            }
        }

        public void RenderujKalendarSaVremenima(IList<UnosVremena> vremena, IList<UnosVremenaSati> sati, DayRenderEventArgs args)
        {
            if (vremena.Count != 0)
            {
                btnSelektujSveDane.Visible = false;
                btnDeselektujSveDane.Visible = true;

                foreach (UnosVremenaSati sat in sati.Where(sat => !args.Day.IsWeekend && args.Day.Date == sat.UnosVremena.UnosVremenaDatum))
                {
                    args.Cell.Text = sat.UnosVremena.UnosVremenaTipDana + ": " + args.Day.Date.Day + "<br />";
                }

                foreach (UnosVremenaSati sat in sati.Where(sat => !args.Day.IsWeekend && args.Day.Date == sat.UnosVremena.UnosVremenaDatum))
                {
                    args.Cell.Text += sat.TipSata + ": " + sat.BrojSati + "<br />";
                }
            }
            else
            {
                btnSelektujSveDane.Visible = true;
                btnDeselektujSveDane.Visible = false;
            }

            PodesiIspravneVrednosti();
        }

        #endregion

        #region dogadjaji

        protected void GridViewRadnici_OnRowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName.Equals("Selektuj"))
            {
                panelRadnikPodaci.Visible = true;

                Session["RadnikId"] = e.CommandArgument;
                var radnikId = Convert.ToInt32(e.CommandArgument);
                _presenter.InitKalendarPosleSelektovanjaRadnika(this, radnikId);
            }
        }

        protected void RadKalendar_OnSelectionChanged(object sender, SelectedDatesEventArgs e)
        {
            var radnikId = Convert.ToInt32(Session["RadnikId"]);
            var dan = e.SelectedDates.Count - 1 >= 0 ? e.SelectedDates[e.SelectedDates.Count - 1].Date : DateTime.Now;
            
            _presenter.InitPodaciZaRadnikaPosleSelektovanjaDana(this, radnikId, dan);
        }

        protected void RadKalendar_OnDayRender(object sender, DayRenderEventArgs e)
        {
            var radnikId = Convert.ToInt32(Session["RadnikId"]);
            _presenter.KalendarRenderingDana(this, radnikId, e);
        }

        protected void DropDownListOrganizacioneJedinice_OnSelectionIndexChanged(object sender, EventArgs e)
        {
            Session["OrgSemaId"] = ((DropDownList) sender).SelectedValue;

             var orgSemaId = Convert.ToInt32(((DropDownList)sender).SelectedValue);
            _presenter.InitRadniciOrganizacioneSeme(this, orgSemaId);
        }

        protected void BtnSelektujSveDane_OnClick(object sender, EventArgs e)
        {
            var radnikId = Convert.ToInt32(Session["RadnikId"]);
            _presenter.SelektujSveDaneRadnikaZaMesec(this, radnikId, radKalendar.SelectedDate.Year, radKalendar.SelectedDate.Month);
        }

        protected void BtnDeselektujSveDane_OnClick(object sender, EventArgs e)
        {
            var radnikId = Convert.ToInt32(Session["RadnikId"]);
            _presenter.DeselektujSveDaneRadnikaZaMesec(this, radnikId, radKalendar.SelectedDate.Year, radKalendar.SelectedDate.Month);
        }

        protected void BtnDodajIliIzmeni_OnClick(object sender, EventArgs args)
        {
            var radnikId = Convert.ToInt32(Session["RadnikId"]);
            var datum = Convert.ToDateTime(lblDatum.Text);
            var trajanje = Convert.ToInt32(tbBrojSati.Text);
            var opis = tbOpis.Text;
            var tipDana = ddlTipDana.SelectedItem.Text;

            _presenter.DodajIliIzmeniDanZaRadnika(this, radnikId, datum, trajanje, opis, tipDana);
        }

        protected void BtnDodajPosebneSate_OnClick(object sender, EventArgs e)
        {
            var radnikId = Convert.ToInt32(Session["RadnikId"]);
            var datum = Convert.ToDateTime(lblDatum.Text);
            var brojSati = Convert.ToInt32((tbBrojPosebnihSati.Text));
            var tipDana = ddlTipDana.SelectedItem.Text;
            var tipSata = ddlTipSataDodajPosebneSate.SelectedItem.Text;

            _presenter.DodajPosebneSateRadnikuZaDan(this, radnikId, datum, brojSati, tipDana, tipSata);
        }

        #endregion

        #region usluzini metodi

        protected void PodesiIspravneVrednosti()
        {
            lblDatum.Text = radKalendar.SelectedDate.ToShortDateString();
            datechosen.Value = lblDatum.Text;
        }

        #endregion
    }
}